package com.ungao.framework;

import com.ungao.framework.define.BeanDefinition;
import com.ungao.framework.exception.MultipartBeanException;
import com.ungao.framework.exception.RegisterBeanException;

/**
 * 应用上下文
 *
 * @author vic-ungao
 */
public interface ApplicationContext {

    /**
     * 获取一个对象
     * 所有返回对象都是代理对象
     *
     * @param clazz
     * @param <T>
     * @return
     */
    <T> T getBean(Class<T> clazz) throws MultipartBeanException;

    /**
     * 获取一个对象
     * 所有返回对象都是代理对象
     *
     * @param beanName
     * @param <T>
     * @return
     */
    <T> T getBean(String beanName) throws MultipartBeanException;

    /**
     * 注册BeanDefinition对象到容器
     *
     * @param beanName
     * @param beanDefinition
     * @throws RegisterBeanException
     */
    void registerDefinition(String beanName, BeanDefinition beanDefinition) throws RegisterBeanException;

    /**
     * 获取对象名称
     *
     * @param clazz
     * @return
     */
    String getBeanName(Class clazz);
}
